今天要來玩伺服馬達~
我們使用 SG-90 透過PWM控制 精準控制角度從0° ~ 180°
常使用在旋轉物體、移動機器人手、腳或是移動感測器等等
伺服馬達(servo motor)由減速齒輪、控制電路、電位器、直流馬達和減速齒輪,當我們送入脈衝信號後,馬達轉動造成電位器改變,內部的控制電路會判斷電位器與目標角度位置至相同時停止轉動,即可精準控制電路。
SG-90 接腳:
SG-90可控角度在0° ~ 180°之間,控制方式就是輸入50Hz脈衝訊號,同時脈衝的寬度(也就是高電位的持續時間)必須在 1ms ~ 2ms之間:
我們來計算一下,頻率為 50 Hz每一週期為 1/50 = 0.02s,也就是 20ms
基本設定:
RCC → HSE、LSE → Crystal/Ceramic Resonator ✅
SYS → Debug Serial Wire ✅
額外設定:
TIM21 → Channel1 → PWM Generation CH1 ✅
最快32MHz
TIM21設定預分頻器(Prescalar)、ARR暫存器:
頻率必須為50 Hz,Clock頻率為32MHz,所以(32 MHz / 50 Hz) = 640k
我將640分到預分頻器(Prescalar),ARR暫存器分到1000
這1000相當是1000%的脈衝寬度,如果我要改變脈衝寬度,只需要調整CCR1的值為X%
假如今天我要1ms的脈衝寬度,就是(1ms * 1000/20) = 50%,將這50%放入CCR1
2毫秒為100%,1.5毫秒為75%,依此類推
但在經過實驗測試之後,發現雖然輸出確實為 1ms ~ 2ms 的脈衝寬度
伺服馬達卻沒有旋轉完整的180°,所以我稍微改變了一下
脈衝寬度範圍改變至 0.5ms ~ 2.5ms,可正常工作!
隨後記得開啟中斷
HAL_TIM_PWM_Start_IT(&htim21, TIM_CHANNEL_1);
TIM21->CCR1 = 25; //佔空比為0.5ms,旋轉角度-90°
HAL_Delay(1000);
TIM21->CCR1 = 75; //佔空比為1.5ms,旋轉角度0°
HAL_Delay(1000);
TIM21->CCR1 = 125; //佔空比為2.5ms,旋轉角度90°
HAL_Delay(1000);
- STM32 Nucleo-64 boards (MB1136)資料手冊
https://www.st.com/resource/en/user_manual/dm00105823-stm32-nucleo-64-boards-mb1136-stmicroelectronics.pdf- STM32L053R8 datasheet
https://www.st.com/resource/en/datasheet/stm32l053r8.pdf- RM0367 Reference manual Ultra-low-power STM32L0x3 advanced Arm®-based 32-bit MCUs
https://www.st.com/resource/en/reference_manual/dm00095744-ultra-low-power-stm32l0x3-advanced-arm-based-32-bit-mcus-stmicroelectronics.pdf- ARM Mbed官網介紹 - NUCLEO-L053R8
https://os.mbed.com/platforms/ST-Nucleo-L053R8/- STM32 官網介紹 - STM32L053R8
https://www.st.com/en/microcontrollers-microprocessors/stm32l053r8.html#overview
- 此開發板售價在臺幣1000元以下,讀者可於以下網站購得:
https://www.mouser.tw/
https://www.digikey.tw/
快結束了!